-- 
-- Control de borrado de arcos de stock
-- No permite que se borre un arco que ya fue usado porque podría haber reportes que cambien su comportamiento
-- 

CREATE OR REPLACE FUNCTION public.tg_stkgra_upd_del()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
DECLARE

BEGIN
  IF ( TG_OP = 'UPDATE' AND 
    	(OLD.origenCodStkEst <> NEW.origenCodStkEst OR
		 OLD.destinoCodStkEst <> NEW.destinoCodStkEst OR
		 OLD.TipoCom <> NEW.TipoCom OR
		 OLD.Signo 	<> NEW.Signo)) OR
		TG_OP = 'DELETE' THEN 
		IF EXISTS (SELECT * FROM ARTM 
				   INNER JOIN COMM ON ARTM.IDCOMM = COMM.ID
				   WHERE 	ARTM.CODSTKEST = OLD.DESTINOCODSTKEST AND 
				         	ARTM.ORIGENCODSTKEST 	= OLD.ORIGENCODSTKEST AND
				   		 	ARTM.SIGNO				= OLD.SIGNO AND
				   			COMM.TIPOCOM 			= OLD.TIPOCOM) THEN
			RAISE EXCEPTION 
			'Hay movimientos que usan este arco, NO PUEDE modificarlo o borrarlo. Debe deshabilitarlo y crear uno nuevo';
	    END IF;
  END IF;
  IF (TG_OP = 'UPDATE') THEN RETURN NEW; END IF;
  IF (TG_OP = 'DELETE') THEN RETURN OLD; END IF;
END;
$BODY$;

ALTER FUNCTION public.tg_stkgra_upd_del()
    OWNER TO abacouser;

CREATE TRIGGER stkgra_upd_del
    BEFORE DELETE OR UPDATE 
    ON public.stkgra
    FOR EACH ROW
    EXECUTE PROCEDURE public.tg_stkgra_upd_del();
    
--    
SELECT aaversion('489.02','489.01');
--
